#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define INIT_SIZE 10 //初始化表的长度
#define DATA_TYPE  int  //数据类型
typedef struct sqlist
{
    int len;//当前实际数据的长度
    int max_len;//保存当前表的总长度
    DATA_TYPE *data;//需要动态分配的
}sqlist,*p_sqlist;//将struct sqlist *类型(结构体指针类型)  重命名为p_sqlist类型

//创建一个空表
int Create_sqlist(p_sqlist L)//struct sqlist * L
{
    L->data=(DATA_TYPE*)malloc(sizeof(DATA_TYPE)*INIT_SIZE);//分配INIT_SIZE*sizeof(DATA_TYPE)空间给L->data
    //判断是否分配失败
    if(L->data==NULL)
    {
        printf("malloc failed\n");
        return -1;
    }
    //将当前表中的数据初始为0
    memset(L->data,0,sizeof(DATA_TYPE)*INIT_SIZE);//清空数据为0
    //表的总允许长度
    L->max_len=INIT_SIZE;
    L->len=0;//当前表的长度
    return 0;
}

//尾部添加一个数据
int tail_insert_data_tolist(DATA_TYPE data,p_sqlist L)
{
    //先判断表是否为空表
    if(L->data==NULL)
    {
        printf("list is null\n");
        return -1;
    }
    //判满
    if(L->len>=L->max_len)
    {
        printf("list is full\n");
        return -1;
    }
    //插入数据
    L->data[L->len++]=data;
   return 0;
}
//中间指定位置插入一个数据  失败 ：返回-1   成功：返回0  如果位置从1开始数
int pos_insert_data_tolist(DATA_TYPE data,p_sqlist L,int pos)
{
    if(L->data==NULL)//表是都为空
    {
        printf("list is null\n");
        return -1;
    }
    if(L->len>=L->max_len)//已经满了
    {
        printf("list is full\n");
        //扩容
        return -1;
    }
    //pos是否合法
    if(pos>L->max_len||pos<1||pos>L->len+1)
    {
        printf("pos is error\n");
        return -1;
    }
    //将data插入表中
    int i;
    for(i=L->len;i>=pos;i--)
    {
        L->data[i]=L->data[i-1];
    }
    L->data[pos-1]=data;
    L->len++;
    return 0;
}
//删除一个数据
int pos_delet_data_fromlist(DATA_TYPE data,p_sqlist L)
{
    if(L->len==0||L->data==NULL)//空表
    {
        printf("list is null\n");
        return -1;
    }
    int i;
    for(i=0;i<L->len;i++)
    {
        if(data==L->data[i])//找到该数据 
        {
            break;
        }
    }
    //如果没有找到数据 表示该数据不在表中  返回-1
    if(i==L->len)
    {
        printf("data is not find\n");
        return -1;
    }
    //
    for(;i<L->len-1;i++)
    {
        L->data[i]=L->data[i+1];
    }
    memset(&L->data[L->len-1],0,sizeof(DATA_TYPE));//将表中的最后一个数据清0
    L->len--;

    return 0;
}
//遍历
int show_list(p_sqlist L)
{
    if(L->len==0||L->data==NULL)
    {
        printf("list is null\n");
        return -1;
    }
   
    printf("show list data:\n");
    for(int i=0;i<L->len;i++)
    {
        printf("%d ",L->data[i]);
    }
    printf("\n");
    return 0;
}
int add_size_forlist(int size,p_sqlist L)
{
    L->data=(DATA_TYPE*)realloc(L->data,sizeof(DATA_TYPE)*(L->max_len+size));
    if (L->data==NULL)
    {
        printf("realloc faild\n");
        return -1;
    }
    
    L->max_len+=size;
    return 0;

}

//找某个元素位置的函数  找到了返回位置  没找到返回-1  假设位置从1开始数
int find_data_pos(DATA_TYPE dat,p_sqlist L)
{
    //判空
    if(L->len==0||L->data==NULL)
    {
        printf("list is null\n");
        return -1;
    }
    int i;
    for(i=0;i<L->len;i++)
    {
        if(L->data[i]==dat)//找到这个数据了
        {
            //将位置返回
            return i+1;//
        }
    }
    return -1;
}
//求两个表的并集 失败：-1  成功：0
int list_merge(p_sqlist L1,p_sqlist L2)
{
    //L1 判空
    if(L1->len==0||L1->data==NULL)
    {
      //  printf("L1 is null\n");
      //将L2给L1
      *L1=*L2;
      return 0;
    }
    if (L2->len==0||L2->data==NULL)
    {
        return 0;
    }
    //两个表都有数据  在L1中找 有没有L2的第i个数据
    for(int i=0;i<L2->len;i++)
    {
        int res;
        res=find_data_pos(L2->data[i],L1);//找到了会返回位置   没有找到 -1
        if(res==-1)
        { 
            //只有在L1未满的时候能够并入
                if(L1->len<L1->max_len)
                {
                   //插入进去  L1尾部
                    tail_insert_data_tolist(L2->data[i],L1);
                   
                }
                else
                {
                     //要加一个判满的操作  如果满了就扩容   
                     if(!add_size_forlist(1,L1)) 
                    {
                         tail_insert_data_tolist(L2->data[i],L1);
                      }
                }
            
        }
    }
    return 0;
    

}
//删除表中重复的数据
int delet_list_redata(p_sqlist L)
{
    int i=0,j,flag=0,isfind=0;//flag：
    for(i=0;i<L->len;i++)
    {
        isfind=0;//
        for(j=i+1;j<L->len;j++)
        {
            if(L->data[i]==L->data[j])//如果找到了不做处理
            {  
                isfind=1;//找到了  1
            }
        }
        if(isfind==0)//没有找到
        {

          L->data[flag]=L->data[i];  
            flag++;
        }    
    }
   //删除L->len后面的数据
   for(i=L->len-1;i>=flag;i--)
   {
        memset(&L->data[i],0,sizeof(DATA_TYPE));
   }
        L->len=flag;
       

}
int delet_data_frompos(p_sqlist L,int pos)
{
    if(L->data==NULL)//表是都为空
    {
        printf("list is null\n");
        return -1;
    }
    //pos是否合法
    if(pos>L->max_len||pos<1||pos>L->len+1)
    {
        printf("pos is error\n");
        return -1;
    }
    //将pos个位置的后面的数据往前移动
    for(int i=pos+1;i<L->len-1;i++)
    {
        L->data[i]=L->data[i+1];
    }
    L->len--;
    return 0;
}
//插入数据的时候 先判断有没有相同的  
int delet_list_redata2(p_sqlist L)
{
    int i,j;//i=0:从当前的位置开始
    //判空
    i=0;
    while(i<L->len)
    {
        
        j=find_data_pos(L->data[i],L);//找这个元素的位置
      /*  if (j==-1)//在自己表中找  不可能找不到
        {
         //没有找到
             i++;//找下一个元素
             continue;
        }
      */
      if((j-1)!=i)  //如果 找到了  因为i个是第一个数据 
        {
            //删除这个位置的数据
            delet_data_frompos(L,j);//删除掉该元素
            i--;
        }
        i++;
    }
}

int main(int argc, char const *argv[])
{
  
    sqlist list;//结构体类型变量
    sqlist list2;  
    //删除重复元素的测试
    Create_sqlist(&list);//创建一个表
    // tail_insert_data_tolist(1,&list);
    // tail_insert_data_tolist(2,&list);
    // tail_insert_data_tolist(1,&list);
    tail_insert_data_tolist(1,&list);
    tail_insert_data_tolist(1,&list);
    tail_insert_data_tolist(1,&list);
    tail_insert_data_tolist(1,&list);
    tail_insert_data_tolist(1,&list);
    tail_insert_data_tolist(1,&list);
    tail_insert_data_tolist(1,&list);
    tail_insert_data_tolist(1,&list);
  //  delet_list_redata(&list);//删除重复元素函数
    show_list(&list);
    delet_list_redata2(&list);
    show_list(&list);
    //while(1);
   // 合并测试
  //  Create_sqlist(&list);//创建一个表
  //  tail_insert_data_tolist(1,&list);
  //  tail_insert_data_tolist(2,&list);
  //  tail_insert_data_tolist(3,&list);
  //  tail_insert_data_tolist(4,&list);
  //  tail_insert_data_tolist(5,&list);
  //  tail_insert_data_tolist(6,&list);
  //  tail_insert_data_tolist(10,&list);
  //  tail_insert_data_tolist(11,&list);
  //  show_list(&list);
//
  //  
  //  Create_sqlist(&list2);//创建另一个表
  //  tail_insert_data_tolist(7,&list2);
  //  tail_insert_data_tolist(3,&list2);
  //  tail_insert_data_tolist(1,&list2);
  //  tail_insert_data_tolist(8,&list2);
  //  tail_insert_data_tolist(9,&list2);
  //  list_merge(&list2,&list);
  //  show_list(&list2);
  //  while(1);


    // tail_insert_data_tolist(7,&list);
    // tail_insert_data_tolist(8,&list);
    // tail_insert_data_tolist(9,&list);
    // tail_insert_data_tolist(10,&list);
    // tail_insert_data_tolist(11,&list);
 //  show_list(&list);
 //  pos_insert_data_tolist(100,&list,5);
 //  show_list(&list);
 //  pos_insert_data_tolist(110,&list,1);
 //  show_list(&list);
 //  pos_insert_data_tolist(120,&list,9);
 //  show_list(&list);
 //  pos_insert_data_tolist(220,&list,10);
 //  show_list(&list);
 //  printf("在第11个位置插入数据\n");
 //  pos_insert_data_tolist(220,&list,11);
 //  show_list(&list);
    //扩容
 //   add_size_forlist(2,&list);
 //   printf("扩容后继续在第11个位置插入数据");
 //   pos_insert_data_tolist(220,&list,11);
 //   show_list(&list);
 //   printf("扩容后继续在第12个位置插入数据");
 //   pos_insert_data_tolist(320,&list,12);
 //   show_list(&list);
 //   printf("扩容后继续在第13个位置插入数据");
 //   pos_insert_data_tolist(420,&list,13);
 //   show_list(&list);

 //  printf("删除数据测试：\n");
 //  printf("110\n");
 //  pos_delet_data_fromlist(110,&list);
 //  show_list(&list);
 //  printf("320\n");
 //  pos_delet_data_fromlist(320,&list);
 //  show_list(&list);
 //  printf("当前表的长度为：%d\n",list.len);
    /* code */
    return 0;
}
